// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  modules: [
    "@element-plus/nuxt",
    "@unocss/nuxt",
    "@sidebase/nuxt-auth",
    "@pinia/nuxt"
    // '@nuxt/image',
    // '@nuxt/content'
  ],
  css: ["~/assets/css/unocss.scss", "~/assets/scss/index.scss"],
  runtimeConfig: {
    JWT_SECRET: process.env.JWT_SECRET,
  },
  app: {
    head: {
      meta: [
        { name: 'viewport', content: 'width=device-width, initial-scale=1' },
        { name: 'description', content: '侯老师编程网站，既有高质量的免费教程，也有更精品的系统课程，涵盖我的世界、植物大战僵尸、塔防、卡牌、象棋等热门游戏制作教程，以及教师节、母亲节、中秋节等创意动画制作教程，更有单词、成语、音乐、数学、排座位等学习工具制作教程，还可以免费下载Scratch\Python\VSCode等常见编程软件，话不多说，开始编程，一起体验思考的乐趣!' },
      ],
      link: [
        { rel: 'preconnect', href: 'https://cdn.codinghou.cn' },
        // 预加载关键资源
        { rel: 'dns-prefetch', href: 'https://cdn.codinghou.cn' },
      ]
    },
    cdnURL: process.env.CDN_BASE_URL || 'https://cdn.codinghou.cn/ai/pc/build',
  },
  routeRules: {
    // '/': { swr: 60 * 10 }, // 缓存 10 分钟，后台每 10 分钟重新验证一次
    "/turtle/turtleeditor": { ssr: false },
    // 添加更多客户端渲染的路由
    "/scratch/**": { ssr: false },
    // 静态资源优化
    "/assets/**": {
      headers: {
        'cache-control': 'public,max-age=31536000,immutable'
      }
    },
    // 添加系统路径规则
    "/.well-known/**": {
      prerender: false,
      index: false,
      headers: { 'cache-control': 'no-cache' }
    },
    "/favicon.ico": {
      prerender: false,
      headers: { 'cache-control': 'public,max-age=86400' }
    },
  },


  elementPlus: {
    icon: "ElIcon",
    themes: ["dark"],
    importStyle: 'css',
    // 添加这个配置确保组件正确注册
    components: ['ElMessage', 'ElDialog', 'ElForm', 'ElInput', 'ElIcon'],
  },
  experimental: {
    renderJsonPayloads: true, // ✅ 开启极小体积 json payload 模式
    // 添加 payload 序列化配置
    payloadExtraction: false, // 禁用 payload 提取
  },

  build: {
    transpile: ['element-plus'], // ✅ 确保 element-plus 不被 vite 提前打包，避免兼容问题
  },
  vite: {
    optimizeDeps: {
      include: ['vue', 'vue-router', 'pinia', 'element-plus', 'xlsx', 'lodash'],
      exclude: [] // ✅ 防止 element-plus 重复打包
      // exclude: ['element-plus','lodash'] // ✅ 防止 element-plus 重复打包
    },
    // 添加缓存优化
    cacheDir: './.vite-cache',
    build: {
      cssCodeSplit: true,
      minify: 'terser',
      terserOptions: {
        compress: {
          // 生产环境压缩优化
          drop_console: process.env.NODE_ENV === 'production',
          drop_debugger: process.env.NODE_ENV === 'production'
        }
      },
      rollupOptions: {
        output: {
          // manualChunks(id) {
          //   // if (id.includes('node_modules')) {
          //   //   if (id.includes('element-plus')) return 'element-plus'
          //   //   if (id.includes('vue3-count-to')) return 'vue3-count-to'
          //   //   if (id.includes('qrcode-vue3')) return 'qrcode-vue3'
          //   //   // 添加更多常用依赖的代码分割
          //   //   if (id.includes('@element-plus/icons-vue')) return 'element-plus-icons'
          //   //   if (id.includes('lodash')) return 'lodash'
          //   //   // 将小型依赖合并到一个块中
          //   //   return 'vendor'
          //   // }
          // }
        }
      }
    },
    css: {
      preprocessorOptions: {
        scss: {
          // additionalData: `@use "@/assets/scss/element/index.scss" as element;`,
        },
      },
    },
  },

  auth: {
    provider: {
      type: "local",
      endpoints: {
        getSession: { path: "/user" },
        signIn: { path: "/login" },
        signOut: { path: "/logout" },
      },
      pages: {
        login: "/",
      },
      token: {
        signInResponseTokenPointer: "/token/nuxtAccessToken",
        maxAgeInSeconds: 30 * 24 * 60 * 60,
        // 禁用 cookie 存储
        cookieName: null, // 或者完全移除这个配置项
        // 使用 sessionStorage 或 localStorage
        storageType: 'localStorage', // 'localStorage' | 'sessionStorage'
        headerName: 'Authorization', // Token 通过 header 传输
        type: 'Bearer',
      },
      sessionDataType: {
        id: "string",
        realname: "string",
        nickname: "string",
        avatar: "string",
        subscriptions: "{ id: number, status: 'ACTIVE' | 'INACTIVE' }[]",
      },
    },
    session: {
      strategy: 'jwt', // 使用 JWT 策略
      maxAge: 30 * 24 * 60 * 60, // 30 days
      // 禁用基于窗口焦点的刷新，避免多实例冲突
      enableRefreshOnWindowFocus: false,

      // 延长定期刷新间隔，减少 Redis 压力
      enableRefreshPeriodically: 3600000, // 每小时刷新一次
    },
    globalAppMiddleware: {
      isEnabled: true,
      exclude: [
        '/sitemap.xml',
        '/sitemap-main.xml',
        /^\/sitemap-works\/\d+\.xml$/,
        /^\/sitemap-courses\/\d+\.xml$/,
        '/robots.txt',
        // 添加 DevTools 和系统路径排除
        '/.well-known/**',
        '/favicon.ico',
        '/_nuxt/**',
        '/api/_content/**',
        // Chrome DevTools 相关路径
        '/.well-known/appspecific/**',

      ]
    },
  },





  devtools: {
    enabled: false,
    timeline: {
      enabled: false,
    },
  },
  // 启用选择性缓存以加速热更新
  server: {
    hmr: {
      overlay: false // 禁用 HMR 错误覆盖，减少资源消耗
    },
    watch: {
      usePolling: false, // 在某些系统上可能需要设为 true
      ignored: [
        '**/vite-cache/**',   // 忽略 vite 缓存目录
        '**/.git/**',        // 忽略 git 目录
        '**/public/**',     // 忽略 public 目录
        '**/.output/**',    // 忽略 Nuxt 构建输出目录
        '**/node_modules/**'//（一般默认已忽略，可加固）
      ]
    }
  },
  devServer: {
    port: 5001,
  },

  plugins: [
    // { src: '@/plugins/editor.ts', ssr: false }
    // { src: '@/plugins/codemirror.ts', ssr: false }
  ],

  compatibilityDate: "2025-04-14",

});